/**
 * @Author: Jiang Zhongxun
 * @Date: 2024-10-06 14:22:46
 * @FilePath: /Socket/practiceProject/src/server/loginAndRegister.c
 * @Description: 登录和注册接口
 * @Copyright (c) 2024 by 蒋仲勋, All Rights Reserved.
 */
#include "../../include/server/loginAndRegister.h"
#include "../../include/db/dbDefinition.h"
#include "../../include/db/dbOperation.h"

/**
 * @description: 用户注册接口
 * @param {sqlite3} *db SQLite3数据库指针句柄
 * @param {char} *userName 用户名
 * @param {char} *passwd 密码
 * @param {int} *registerStatus 注册状态【100注册失败，200用户已存在，300注册成功】
 * @return {*} 成功返回0，失败返回非0的数
 */
int userRegister(sqlite3 *db, char *userName, char *passwd, int *registerStatus)
{
    // char userName[20] = {0};
    // char passwd[20] = {0};
    // printf("请输入用户名: ");
    // scanf("%s", userName);
    // printf("请输入密码: ");
    // scanf("%s", passwd);
    // 判断注册的用户是否已存在相同的用户名
    // 相同的用户名则提示用户名已存在，请直接登录或重新注册
    // 不存在同名的用户，则提示注册成功，并插入数据到数据库
    char *errmsg = NULL;
    int row, column;
    char **result = NULL;
    char sql[256] = {0};
    char *operationName = "userInfo";
    // char message[128] = {0};
    int selectCount; // 查询的总记录数
    sprintf(sql, "SELECT COUNT(*) FROM %s WHERE userName = '%s';", USER_TABLE_NAME, userName);
    // 调用 conditionQuery 执行查询操作
    result = conditionQuery(db, sql, &result, &row, &column, &errmsg, operationName);
    if (result == NULL)
    {
        fprintf(stderr, "查询失败: %s\n", errmsg ? errmsg : "未知错误");
        return -1;
    }
    if (0 == row)
    {
        printf("没有查到任何信息!\n");
        return 0;
    }
    else
    {
        // 悉数打印 row 行记录的数据
        int i, j;
        for (i = 1; i <= row; i++)
        {
            for (j = 0; j < column; j++)
            {
                printf("查询的总记录数为: %s\n", result[i * column + j]);    // 访问第 i 行的第 j 列
                selectCount = (int)strtol(result[i * column + j], NULL, 10); // 将结果字符串转换为整型
                printf("selectCount = %d\n", selectCount);                   // 转换后的整型
                fflush(stdout);                                              // 强制刷新缓冲区
            }
        }
    }
    if (0 == selectCount)
    {
        // 查询返回的结果集中统计行数为0，表示不存在相同的用户名。直接注册，插入数据到表中即可
        bzero(sql, sizeof(sql));
        sprintf(sql, "INSERT INTO %s (userName, passwd) VALUES ('%s', '%s');", USER_TABLE_NAME, userName, passwd);
        int ret = execOperate(db, sql, &errmsg, operationName);
        if (0 != ret)
        {
            *registerStatus = 100;
            fprintf(stderr, "用户【%s】注册失败! 请稍后再试!\n", userName);
            return -1;
        }
        *registerStatus = 300;
        printf("用户【%s】注册成功! 请登录!\n", userName);
    }
    else
    {
        *registerStatus = 200;
        // 不可能小于0，所以只要是大于0，那就是存在相同的用户名
        fprintf(stderr, "用户名【%s】已存在! 请直接登录或重新注册!\n", userName);
        return -1;
    }
    return 0;
}

/**
 * @description: 用户登录接口
 * @param {sqlite3} *db SQLite3数据库指针句柄
 * @param {char} *userName 用户名
 * @param {char} *passwd 密码
 * @param {int} *loginStatus 登录状态【100用户不存在，200密码错误, 300登录成功】
 * @return {*} 成功返回0，失败返回非0的数
 */
int userLogin(sqlite3 *db, char *userName, char *passwd, int *loginStatus)
{
    // char userName[20] = {0};
    // char passwd[20] = {0};
    // printf("请输入用户名: ");
    // scanf("%s", userName);
    // printf("请输入密码: ");
    // scanf("%s", passwd);
    // 判断要登录的用户是否存在
    // 要登录的用户存在，则判断密码是否一致，一致则登录成功，不一致则登录失败
    // 要登录的用户不存在，则提示用户不存在，请先注册
    char *errmsg = NULL;
    int row, column;
    char **result = NULL;
    char sql[256] = {0};
    char *operationName = "userInfo";
    // char message[128] = {0};
    sprintf(sql, "SELECT passwd FROM %s WHERE userName = '%s';", USER_TABLE_NAME, userName);
    // 调用 conditionQuery 执行查询操作
    result = conditionQuery(db, sql, &result, &row, &column, &errmsg, operationName);
    if (result == NULL)
    {
        fprintf(stderr, "查询失败: %s\n", errmsg ? errmsg : "未知错误");
        return -1;
    }
    // 查询返回的结果集中行数为0，表示不存在要登录的用户名
    if (0 == row)
    {
        fprintf(stderr, "用户名【%s】不存在! 请先进行注册!\n", userName);
        *loginStatus = 100;
        return -1;
    }
    else
    {
        // 悉数打印 row 行记录的数据
        int i, j;
        for (i = 0; i <= row; i++)
        {
            for (j = 0; j < column; j++)
            {
                // printf("%s\t", result[i * column + j]);
                // fflush(stdout); // 强制刷新缓冲区
            }
        }
        printf("查到的密码是: %s\n", result[1]);
        if (0 == strcmp(result[1], passwd))
        {
            printf("用户【%s】登录成功!\n", userName);
            *loginStatus = 300;
            return 0;
        }
        else
        {
            printf("用户【%s】密码错误!\n", userName);
            *loginStatus = 200;
            return -1;
        }
    }
    return 0;
}
